package com.woniu.inlet.interceptor;

import com.alibaba.fastjson.JSON;
import com.woniu.utils.JwtTokenUtil;
import com.woniu.utils.LoginPass;
import com.woniu.utils.ResultResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * 身份验证拦截器
 */
@Component
@Slf4j
@Order(-100)
public class AuthenticationInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        log.debug("请求路径为{}", uri);
        /**
         * 当前请求触发的、请求的不是 Controller 中的方法，
         * 而是 jsp、thymeleaf 这样的静态资源，或者 .css、.html、.js 这样的静态资源，就无条件放行。
         */
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }

        if (uri.indexOf("swagger") != -1) {
            return true;
        }

/*        if (uri.equals("/user/verify")||uri.equals("/user/register")) {
            return true;
        }*/

        String token = "";

        //得到请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (String s : parameterMap.keySet()) {
            if (s.equals("token")) {
                token = parameterMap.get(s)[0];
            }
       /*     String[] x = parameterMap.get(s);
            log.debug("参数为{}，值为{}", s, x[0]);
            if ("null".equals(x[0]) || x[0].trim().length() == 0) {
                responseMsg(response, "参数值不能为空");
                return false;
            }*/
        }

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        log.debug("请求的方法为{}", handlerMethod);

        //得到请求头
//        String token = request.getHeader("token");
/*        log.debug("请求头的token为[{}]", token);
        if (token.length() != 0) {
            if (JwtTokenUtil.checkSign(token)) {
                return true;
            } else {
                responseMsg(response, "token非法");
                return false;
            }
        }*/



        /* 接下来的事情就是【反射】领域的知识点了。*/
        // 判断本次请求所触发的那个请求处理方法的脑袋上面有没有 @Xxx 注解。
  /*      if (method.isAnnotationPresent(LoginPass.class)) {
            // @LoginPass 意味着只有登录用户才能访问。
            if (JwtTokenUtil.checkSign(token)) {
                return true;
            } else {
                responseMsg(response, "请登录");
                return false;
            }
        }*/


        // @Yyy 意味着当前用户必须具备某种角色才能访问该 URL
        if (method.isAnnotationPresent(LoginPass.class)) {
            // 通过反射，取出 @Yyy 注解中的 value 的值：角色1、角色2
            if ("admin".equals(JwtTokenUtil.getAdmin(token))) {
                return true;
            } else if ("user".equals(JwtTokenUtil.getAdmin(token))) {
                // response.getWriter().write("权限不足！！！");
                responseMsg(response, "权限不足！！！");
                return false;
            } else {
                responseMsg(response, "token非法");

                return false;
            }
        }
        return true;
    }

    /**
     * 响应信息给页面
     */
    public static void responseMsg(HttpServletResponse response, Object obj) {
        response.setContentType("application/json;charset=utf-8");
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.print(JSON.toJSON(new ResultResponseUtil<>(500, "ok", obj)));
        writer.close();
        try {
            response.flushBuffer();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

